package cn.edu.nju.software.cdiy.algorithm.assessor;

import cn.edu.nju.software.cdiy.bean.HardwareSet;
import cn.edu.nju.software.cdiy.service.UtilService;
import cn.edu.nju.software.cdiy.util.Constant;
import cn.edu.nju.software.cdiy.util.NumberFormatter;

public class Optimizer {
	
	private UtilService utilService;
	
	public void setUtilService(UtilService utilService) {
		this.utilService = utilService;
	}
	
	// 最终返回的意见
	private String message;

	public String getOptimizeSuggestion(HardwareSet hardwareSet) {
		message = "优化建议：";
		HardwareSet hs = utilService.fillHardwareSet(hardwareSet);
		// 频率是否差距过大
		if (hs.getMemory() != null && hs.getCpu()!=null)
			message += frequencyDetect(hs);
		message += notMainstreamDetect(hs);
		// 还有其他检测则继续添加相应的..Detect()方法 继续对message进行+操作

		if (message.equals(""))
			message += Constant.DEFAULT_OPTIMIZE_MESSAGE;
		return message;
	}

	private String frequencyDetect(HardwareSet hs) {
		/*
		 * 检测频率是否差距过大 若没有优化可能 则直接返回 若有 则对returnMessage进行+操作 不同message直接用“;”分隔！！
		 */
		String returnMessage = "";

		// 对hs进行检测
		double masFq = hs.getCpu().getMasterFrequency() * 1000;
		String s = hs.getMemory().getMemFrequency().getValue();
		double memFq = NumberFormatter.getNumber(s);

		if (masFq > memFq) {
			if (masFq - memFq >= 200) {
				returnMessage += "CPU主频超出内存频率过多，建议采用高一些内存频率的内存或者主频低一些的CPU；";
			}
		} else
			returnMessage += "内存频率超出CPU主频，请选用能支持更高内存频率的CPU或者使用低于该CPU主频的内存频率的内存；";

		return returnMessage;
	}

	private String notMainstreamDetect(HardwareSet hs) {
		/*
		 * 检测各个硬件的硬数据是否非主流，过于落后 若没有优化可能 则直接返回 若有 则对returnMessage进行+操作
		 * 不同message直接用“;”分隔！！
		 */
		String returnMessage = "";

		// 对hs进行检测
		if (hs.getCpu() != null) {
			if (hs.getCpu().getManuTech().getKey() > 172) {
				returnMessage += "CPU制造工艺落后，建议选择32nm工艺的CPU，";
			}
		}
		if (hs.getMemory() != null) {
			if (hs.getMemory().getMemCapacity().getKey() > 268) {
				returnMessage += "内存容量太小，建议选择2G以上内存容量的内存，";
			} else if (hs.getMemory().getMemType().getKey() < 233) {
				returnMessage += "内存类型落后，建议选择DDR3类型的内存，";
			} else if (hs.getMemory().getMemFrequency().getKey() > 243) {
				returnMessage += "内存频率较低，建议选择1333Mhz以上频率的内存";
			}
		}
		if (hs.getGraphics() != null) {
			if (hs.getGraphics().getVideoMemCapacity().getKey() < 418) {
				returnMessage += "显存容量太小，建议选择512MB以上显存容量的显卡，";
			}
		}
		if (hs.getDisk() != null) {
			if (hs.getDisk().getSingleCapacity().getKey() < 488) {
				returnMessage += "硬盘容量太小，建议选择320GB以上容量的硬盘，";
			}
		}

		return returnMessage;
	}

}
